package nuc.soft.xsf.tools;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import net.sf.json.JSONArray;
import nuc.soft.xsf.model.Menu;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import com.alibaba.fastjson.JSONObject;
import com.jayway.jsonpath.JsonPath;


public class JsonUtil {

	@SuppressWarnings("unchecked")
	public static Map<String, Object> json2Map(String json)
			throws JsonParseException, JsonMappingException, IOException {
		ObjectMapper mapper = new ObjectMapper();
		Map<String, Object> map = mapper.readValue(json, Map.class);
		return map;
	}
	
	@SuppressWarnings("unchecked")
	public static Map<String, String> toMap(String json)
			throws JsonParseException, JsonMappingException, IOException {
		ObjectMapper mapper = new ObjectMapper();
		Map<String, String> map = mapper.readValue(json, Map.class);
		return map;
	}

	public static String pojoToJson(Object obj) throws JsonGenerationException,
			JsonMappingException, IOException {
		ObjectMapper mapper = new ObjectMapper();
		String json = mapper.writeValueAsString(obj);
		return json;
	}

	public static <T> T json2Pojo(String json, Class<T> toParseClass)
			throws JsonParseException, JsonMappingException, IOException {
		if (json == null) {
			return null;
		}
		ObjectMapper mapper = new ObjectMapper();
		return mapper.readValue(json, toParseClass);
	}

	public static String deelMenu(List<Menu> menuList) {
//		JSONObject jsonO = new JSONObject();
		JSONObject jsonB = new JSONObject();
		JSONObject json = new JSONObject();
		JSONArray jsonNode = new JSONArray();
		JSONArray jsonLeaf = new JSONArray();
		for (Menu menu : menuList) {
			if (menu.getParentMenu().equals("-1")) {
				jsonB.put("id", menu.getMenuId());
				jsonB.put("text", menu.getMenuName());
				jsonB.put("url", menu.getMenuUrl());
				jsonB.put("classes", menu.getMenuIcon());
				jsonB.put("nodes", jsonLeaf);
				jsonNode.add(jsonB);
				jsonB.clear();
			} else {
				List<Map<String, String>> mp = JsonPath.read(jsonNode,
						"$.[?(@.id == '" + menu.getParentMenu() + "')]");
				List<Map<String, String>> mp1 = JsonPath.read(jsonNode,
						"$.[?(@.id != '" + menu.getParentMenu() + "')]");
				if (mp != null) {
					json = (JSONObject) JSONObject.toJSON(mp.get(0));
					jsonB.put("id", menu.getMenuId());
					jsonB.put("text", menu.getMenuName());
					jsonB.put("url", menu.getMenuUrl());
					json.getJSONArray("nodes").add(jsonB);
					jsonNode.clear();
					jsonNode.addAll(mp1);
					jsonNode.add(json);
					jsonB.clear();
				}
			}
		}
		return jsonNode.toString();
	}

	public static String deelDesk(List<Menu> menuList) {
		JSONObject jsonB = new JSONObject();
		JSONArray jsonNode = new JSONArray();
		for (Menu menu : menuList) {
			jsonB.put("id", menu.getMenuId());
			jsonB.put("text", menu.getMenuName());
			jsonB.put("url", menu.getMenuUrl());
			jsonB.put("classes", menu.getMenuIcon());
			jsonNode.add(jsonB);
			jsonB.clear();
		}
		return jsonNode.toString();
	}
}
